#include <stdio.h>  
#include <malloc.h>  
#include <stdbool.h>  
  
#define MAX_SIZE 100  
  
typedef char ElemType;  
typedef struct  
{  
    ElemType data[MAX_SIZE];  
    int queue_front;  
    int queue_rear;  
}SeqQueue;   
  
static void init_queue(SeqQueue *&q)   
{  
    q = (SeqQueue *)malloc(sizeof(SeqQueue));  
    q->queue_front = q->queue_rear = 0;  
}  
  
static void destroy_queue(SeqQueue *&q)  
{  
    free(q);  
}  
  
static bool queue_empty(SeqQueue *q)  
{  
    return (q->queue_front == q->queue_rear);  
}  
  
static bool enter_queue(SeqQueue *&q, ElemType e)  
{  
    if((q->queue_rear + 1) % MAX_SIZE == q->queue_front)  
        return false;  
  
    q->queue_rear = (q->queue_rear + 1) % MAX_SIZE;  
    q->data[q->queue_rear] = e;   
  
    return true;  
}  
  
static bool de_queue(SeqQueue *&q, ElemType &e)  
{  
    if(q->queue_front == q->queue_rear)  
        return false;  
          
    e = q->data[q->queue_front]; //正确返回出队元素  
    q->queue_front = (q->queue_front + 1) % MAX_SIZE;  
  
    return true;  
}  
  
int main(int argc, char *argv[])  
{  
    ElemType e;  
    SeqQueue *q;  
  
    printf("环形队列基本运算如下:\n");  
    printf("   (1)初始化队列q\n");  
    init_queue(q);  
    printf("   (2)依次进队元素a、b、c\n");  
    enter_queue(q, 'a');  
    enter_queue(q, 'b');  
    enter_queue(q, 'c');  
    printf("   (3)队列为%s\n", (queue_empty(q) ? "空" : "非空"));  
    if(!de_queue(q, e))  
        printf("队空,不能出队\n");  
    else  
        printf("   (4)出队一个元素%c\n", e);  
  
    printf("   (5)依次进队元素d、e、f\n");  
    enter_queue(q, 'd');  
    enter_queue(q, 'e');  
    enter_queue(q, 'f');  
  
    printf("   (6)出队列序列: ");  
    while(!queue_empty(q))  
    {  
        de_queue(q, e);  
        printf("%c ", e);  
    }  
    printf("\n");  
    printf("   (7)释放队列\n");  
    destroy_queue(q);  
  
    return 0;  
}